#ifndef _DOWNLOAD_9FA3EEBA_2C24_46D3_B3D6_2D9A50BD8857_
#define _DOWNLOAD_9FA3EEBA_2C24_46D3_B3D6_2D9A50BD8857_
#pragma once

#define MAX_URL  2083

/**
 * 下载请求的数据结构
 */
struct UrlRequestData {
  wchar_t   request_url[MAX_URL];         // 下载请求地址
  wchar_t   save_path[MAX_PATH];           // 本地保存路径
  __int64   start_position;                   // 开始下载的位置
};

/**
 * 下载请求响应的数据结构
 */
struct UrlResponseData {
  int  response_code;                      // HTTP响应码
};

/**
 * 下载进度数据结构
 */
struct ProgressData {
  __int64  already_bytes;        // 已经读取的字节数
  __int64  total_bytes;          // 文件总字节数
  __int64  bytes_per_sec;        // 当前速度(bytes/s)
};

struct FinishData {
  int      error_code;               // 错误类型
  wchar_t  error_desc[MAX_PATH];     // 错误描述
};

/**
 * 下载管理接口
 */
class IDownloadProxy {
public:
  /**
   * 下载回调通知接口
   */
  struct NotifyDelegate {
    /**
     * 下载请求回复通知
     * @param symbol唯一地标识下载任务
     * @param data指示下载请求响应信息
     */
    virtual void OnNotifyResponse(unsigned int symbol, const UrlResponseData& data) = 0;
    /**
     * 下载进度通知
     * @param symbol唯一地标识下载任务
     * @param data指示下载进度信息
     */
    virtual void OnNotifyProgress(unsigned int symbol, const ProgressData& data) = 0;
    /**
     * 下载完成通知
     * @param symbol唯一地标识下载任务
     * @param data指示完成的信息
     */
    virtual void OnNotifyFinished(unsigned int symbol, const FinishData& data) = 0;
  };
public:
  /**
   * 设置下载回调接口
   * @param delegate指示回调接口指针
   */
  virtual void SetNotifyDelegate(NotifyDelegate* delegate) = 0;
  /**
   * 添加URL下载请求
   * @param symbol唯一地标识下载任务
   * @param data指示下载请求信息
   */
  virtual void AddUrlRequest(unsigned int symbol, const UrlRequestData* data) = 0;

  /**
   * 取消URL下载请求
   * @param symbol标识下载任务
   */
  virtual void CancelUrlRequest(unsigned int symbol) = 0;
};

#endif//_DOWNLOAD_9FA3EEBA_2C24_46D3_B3D6_2D9A50BD8857_
